/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * @author Stev
 */
public class funcionesServerRE {

    private HashSet registrados = new HashSet();
    private HashMap electivos = new HashMap();
    private HashMap nombres= new HashMap();
    private HashMap comunas= new HashMap();

    public funcionesServerRE() {

        cargarRegistrados();
        comprobarComuna("16783456-6","Heterogeneidad");
        comprobarNombre("Esteban Capmos");
    }

    //Este método implementa las operaciones implementadas en interfaz
    public String validarRut(String rut) {
        int Digito;
        int Contador;
        int Multiplo;
        int Acumulador;
        String RutDigito;
        int int_rut = Integer.parseInt(rut);

        Contador = 2;
        Acumulador = 0;

        while (int_rut != 0) {
            Multiplo = (int_rut % 10) * Contador;
            Acumulador = Acumulador + Multiplo;
            int_rut = int_rut / 10;
            Contador = Contador + 1;
            if (Contador == 8) {
                Contador = 2;
            }
        }
        Digito = 11 - (Acumulador % 11);
        RutDigito = Integer.toString(Digito);
        // Digito.ToString().Trim();
        if (Digito == 10) {
            RutDigito = "K";
        }
        if (Digito == 11) {
            RutDigito = "0";
        }
        return RutDigito;
    }

    //Devuelve true si en una cadena que llega todos son numeros, false en caso contrario
    public boolean esEntero(String cad) {
        for (int i = 0; i < cad.length(); i++) {
            if (!Character.isDigit(cad.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    public void cargarRegistrados() {
        File archivo = new File("servRE.txt");
        FileReader fr = null;
        BufferedReader br;
        boolean exito = false;

        //Abro archivo y saco las lineas de texto
        try {

            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero linea por linea
            String linea;
            String[] contLinea = null;


            while ((linea = br.readLine()) != null) {

                contLinea = linea.split(",");  //Guardo el contenido de linea en un arreglo
                if (contLinea.length >= 4) {
                    registrados.add(contLinea[0]);  //Guardo ruts
                    nombres.put(contLinea[0],contLinea[1]); //Guardo nombres asociado a rut
                    comunas.put(contLinea[0],contLinea[2]); //Guardo comuna asociado a rut
                    electivos.put(contLinea[0], contLinea[3]); //Guardo electivo asociado a rut
                    
                }
            }

        }//fin try de lectura
        catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
      /**
     * Devuelve un string parseado por || con: 0 ó 1 | Msje
     * @param nombre
     * @return 
     */
    public String comprobarNombre(String nombre){   
    
          if(nombres.containsValue(nombre)){
          
          escribirLog("<" + obtenerFecha() + ">" + "<comprobarNombre>" + "<Datos:" + nombre+ ">" + "<1|Nombre Correcto.>");
          return "1|Nombre correcto";
          }
          else{
               escribirLog("<" + obtenerFecha() + ">" + "<comprobarNombre>" + "<Datos:" + nombre+ ">" + "<0|Error.>");
          return "0|Erorr";
          }
    }
    /**
     * Devuelve un string parseado por || con tres elementos: 0 ó 1 | Msje| nombre si es 1.
     * @param RUT
     * @return 
     */
    public String comprobarInscritos(String RUT) {  

        boolean sinCaracteres;
        String[] partes_rut = RUT.split("-");
        String numeros = partes_rut[0];
        sinCaracteres = esEntero(numeros);
        int num_caracteres = partes_rut[0].length();

        //Se verifica que se haya ingresado solo dígitos y el guión
        if ((sinCaracteres == true) && (partes_rut.length != 1)) {
            //Se verifica que el número de dígitos antes del guión correspondan a los de un Rut
            if ((num_caracteres == 7) || (num_caracteres == 8)) {
                String respDV = validarRut(partes_rut[0]);
                String DVer = partes_rut[1];
                //Se verifica que el Rut sea original
                if (respDV.equals(DVer)) {
                    if (verifyRUT(RUT) != true) {

                        escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<No se encuentra registrado>");
                         return "0|No se encuentra registrado|0";

                    } else {

                        if (electivos.get(RUT).equals("Si")) {
                            escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<Ingreso correcto>");
                           String salida= "1|Ingreso correcto|"+nombres.get(RUT);
                        return salida;

                        } else {
                            escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<No tiene acceso a este chat>");
                            return "0|No tiene acceso a este chat (campo igual a 'no')|0";

                        }



                    }
                } else {
                    escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<Rut Inválido. Ingrese un Rut Válido.>");
                    return "0|Rut Inválido. Ingrese un Rut Válido|0";

                }
            } else {
                escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<El Rut ingresado no posee la cantidad de dígitos de un Rut>");
                return "0|El Rut ingresado no posee la cantidad de dígitos de un Rut|0";

            }
        } else {
            escribirLog("<" + obtenerFecha() + ">" + "<comprobarInscritos>" + "<Datos:" + RUT + ">" + "<Formato de Rut Inválido. Ingrese nuevamente su rut según el formato especificado.>");
            return "0|Formato de Rut Inválido. Ingrese nuevamente su rut según el formato especificado|0";

        }


    }
    
    /**
     * Devuelve un string parseado por || con: 0 ó 1 | Msje
     * @param RUT
     * @param comuna
     * @return 
     */
 public String comprobarComuna(String RUT, String comuna) {

        boolean sinCaracteres;
        String[] partes_rut = RUT.split("-");
        String numeros = partes_rut[0];
        sinCaracteres = esEntero(numeros);
        int num_caracteres = partes_rut[0].length();

        //Se verifica que se haya ingresado solo dígitos y el guión
        if ((sinCaracteres == true) && (partes_rut.length != 1)) {
            //Se verifica que el número de dígitos antes del guión correspondan a los de un Rut
            if ((num_caracteres == 7) || (num_caracteres == 8)) {
                String respDV = validarRut(partes_rut[0]);
                String DVer = partes_rut[1];
                //Se verifica que el Rut sea original
                if (respDV.equals(DVer)) {
                    if (verifyRUT(RUT) != true) {

                        escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+ ">" + "<No se encuentra registrado>");
                         return "0|No se encuentra registrado";

                    } else {

                        if (comunas.get(RUT).equals(comuna)) {
                            
                            escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+">" + "<Comuna correcta>");
                           String salida= "1|Comuna correcto";
                        return salida;

                        } else {
                            escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+ ">" + "<No tiene acceso a este chat>");
                            return "0|No tiene acceso a este chat (campo igual a 'no')";

                        }
        }
                } else {
                    escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+ ">" + "<Rut Inválido. Ingrese un Rut Válido.>");
                    return "0|Rut Inválido. Ingrese un Rut Válido";

                }
            } else {
                escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+ ">" + "<El Rut ingresado no posee la cantidad de dígitos de un Rut>");
                return "0|El Rut ingresado no posee la cantidad de dígitos de un Rut";

            }
        } else {
            escribirLog("<" + obtenerFecha() + ">" + "<comprobarComuna>" + "<Datos:" + RUT +","+comuna+ ">" + "<Formato de Rut Inválido. Ingrese nuevamente su rut según el formato especificado.>");
            return "0|Formato de Rut Inválido. Ingrese nuevamente su rut según el formato especificado";

        }


    }
    public boolean verifyRUT(String RUT) {

        if (registrados.contains(RUT)) {
            escribirLog("<" + obtenerFecha() + ">" + "<verifyRUT>" + "<Datos:" + RUT + ">" + "<true>");
            return true;
        } else {
            escribirLog("<" + obtenerFecha() + ">" + "<verifyRUT>" + "<Datos:" + RUT + ">" + "<false>");
            return false;
        }
    }

    public void escribirLog(String mensaje) {

        File archivo;
        archivo = new File("servRE.log");

        try {

            FileWriter w = new FileWriter(archivo, true);
            BufferedWriter bw = new BufferedWriter(w);
            PrintWriter wr = new PrintWriter(bw);

            if (archivo.exists()) {
                wr.append(mensaje + "\n");
            }

            wr.close();
            bw.close();
        } catch (IOException e) {
        };
    }

    private String obtenerFecha() {

        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
        String cadenaFecha = formato.format(fechaActual);

        return cadenaFecha;
    }

}
